/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package entidad;

import Distribuciones.Binomial;
import Distribuciones.BoxMuller;
import Distribuciones.Constante;
import Distribuciones.Distribucion;
import Distribuciones.Exponencial;
import Distribuciones.Gamma;
import Distribuciones.Poisson;
import Distribuciones.Uniforme;
import ec.util.MersenneTwisterFast;
import java.util.ArrayList;

/**
 *
 * @author Operador
 */
public class FactoryDistribucion {
    
    public static enum DISTRIBUCION_NOMBRES{
        BINOMIAL,NORMAL,EXPONENCIAL,GAMMA,POISSON,UNIFORME,CONSTANTE
    }
    
    public static Distribucion generarDistribucion(DISTRIBUCION_NOMBRES dn,ArrayList<Object> atrib){
        switch (dn) {
            case BINOMIAL:
                return new Binomial(Integer.parseInt(atrib.get(0).toString()), Double.valueOf(atrib.get(1).toString()));
            case NORMAL:
                return new BoxMuller(Double.valueOf(atrib.get(0).toString()), Double.valueOf(atrib.get(1).toString()), BoxMuller.DEFAULT_RAIZ);
            case EXPONENCIAL:
                return new Exponencial(Double.valueOf(atrib.get(0).toString()));
            case GAMMA:
                return new Gamma(Double.valueOf(atrib.get(0).toString()), Double.valueOf(atrib.get(1).toString()), (MersenneTwisterFast)atrib.get(2));
            case POISSON:
                return new Poisson(Double.valueOf(atrib.get(0).toString()));
            case UNIFORME:
                return new Uniforme(Double.valueOf(atrib.get(0).toString()), Double.valueOf(atrib.get(1).toString()));
            case CONSTANTE:
                return new Constante(Double.valueOf(atrib.get(0).toString()));
            default:
                throw new AssertionError();
        }
    }
    
    public static String[] getDistribucionParametros(DISTRIBUCION_NOMBRES dn){
        switch (dn) {
            case BINOMIAL:
                return Binomial.parametros;
            case NORMAL:
                return BoxMuller.parametros;
            case EXPONENCIAL:
                return Exponencial.parametros;
            case GAMMA:
                return Gamma.parametros;
            case POISSON:
                return Poisson.parametros;
            case UNIFORME:
                return Uniforme.parametros;
            case CONSTANTE:
                return Constante.parametros;
            default:
                throw new AssertionError();
        }
    }
    
    public static String[] getDistribucionTipos(DISTRIBUCION_NOMBRES dn){
        switch (dn) {
            case BINOMIAL:
                return Binomial.tipoParametros;
            case NORMAL:
                return BoxMuller.tipoParametros;
            case EXPONENCIAL:
                return Exponencial.tipoParametros;
            case GAMMA:
                return Gamma.tipoParametros;
            case POISSON:
                return Poisson.tipoParametros;
            case UNIFORME:
                return Uniforme.tipoParametros;
            case CONSTANTE:
                return Constante.tipoParametros;
            default:
                throw new AssertionError();
        }
    }
    
    public static ArrayList<DISTRIBUCION_NOMBRES> getDistribucionNames(){
        ArrayList<DISTRIBUCION_NOMBRES> lista = new ArrayList<DISTRIBUCION_NOMBRES>();
        lista.add(Binomial.nombre);
        lista.add(BoxMuller.nombre);
        lista.add(Exponencial.nombre);
        lista.add(Gamma.nombre);
        lista.add(Poisson.nombre);
        lista.add(Uniforme.nombre);
        lista.add(Constante.nombre);
        return lista;
    }
    
}
